package 力扣.排序.快速排序;

public class 只出现一次的数136 {
    /**
     * 任选一个数进行三路切分，有三种情况
     *  1、只出现一次的数在上路，此时上路的个数为奇数
     *  2、只出现一次的数在中路，此时中路就是要找的这个数
     *  3、只出现一次的数在下路，此时下路的个数就是奇数
     * @param nums
     * @return
     */
    public int singleNumber(int[] nums) {
        if (nums == null || nums.length % 2 == 0){
            return 0;
        }
        return qsort(nums, 0, nums.length);
    }
    private int qsort(int[] nums,int b ,int e){
        if (b >= e){
            return 0;
        }
        int mid = (b + ((e - b) >> 1));//位运算一定要括号！！！！！！
        int x = nums[mid];
        int l = b,i = b ,r = e - 1;
        while (i <= r){
            if (nums[i] == x){
                i++;
            }else if(nums[i] < x){
                swap(nums,l++,i++);
            }else{
                swap(nums,i,r--);
            }
        }
/*        if ( ((l - b) % 2) != 0){
            return qsort(nums, b, l);
        }else if (((e - i) % 2) != 0){
            return qsort(nums, i, e);
        }else{
            return x;
        }*/
        if ( ((l - b) & 0x01 )== 1){//使用‘&0x01’代替取模运算
            return qsort(nums, b, l);
        }else if (i - 1 == l){
            return x;
        }else{
            return qsort(nums, i, e);
        }
    }

     void swap(int[] A,int i,int j){
        int t = A[i];
        A[i] = A[j];
        A[j] = t;
    }
}
